﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Globalization;

namespace UOL.PagSeguro {
    public class RetornoVenda {

        private string _emailVendedor;
        private string _codigoTransacao;
        private string _codigoReferencia;
        private TipoFrete _tipoFrete;
        private double _valorFrete;
        private string _anotacao;
        private DateTime _data;
        private TipoPagamento _tipoPagamento;
        private StatusTransacao _statusTransacao;
        private Cliente _cliente;
        private List<Produto> _produtos;

        #region Propriedades
        public string EmailVendedor {
            get { return _emailVendedor; }
            set { _emailVendedor = value; }
        }

        /// <summary>
        /// Código da transação retornada pelo PagSeguro.
        /// Este campo informa o código da transação gerada no PagSeguro após a conclusão do pagamento.
        /// </summary>
        public string CodigoTransacao {
            get { return _codigoTransacao; }
            set { _codigoTransacao = value; }
        }

        public string CodigoReferencia {
            get { return _codigoReferencia; }
            set { _codigoReferencia = value; }
        }

        public TipoFrete TipoFrete {
            get { return _tipoFrete; }
            set { _tipoFrete = value; }
        }

        public double ValorFrete {
            get { return _valorFrete; }
            set { _valorFrete = value; }
        }

        public string Anotacao {
            get { return _anotacao; }
            set { _anotacao = value; }
        }

        public DateTime Data {
            get { return _data; }
            set { _data = value; }
        }

        public TipoPagamento TipoPagamento {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }

        public StatusTransacao StatusTransacao {
            get { return _statusTransacao; }
            set { _statusTransacao = value; }
        }

        public Cliente Cliente {
            get { return _cliente; }
            set { _cliente = value; }
        }

        public List<Produto> Produtos {
            get { return _produtos; }
            set { _produtos = value; }
        }
        #endregion

        public RetornoVenda() {

        }

        internal static RetornoVenda CriarViaRespostaNPI(NameValueCollection nvc) {
            RetornoVenda retorno = new RetornoVenda();

            //Pagamento
            retorno.EmailVendedor = nvc["VendedorEmail"];
            retorno.CodigoTransacao = nvc["TransacaoID"];
            retorno.CodigoReferencia = nvc["Referencia"];
            switch (nvc["TipoFrete"]) {
                case "FR":
                    retorno.TipoFrete = TipoFrete.Fixo;
                    break;
                case "SD":
                    retorno.TipoFrete = TipoFrete.Sedex;
                    break;
                case "EN":
                    retorno.TipoFrete = TipoFrete.PAC;
                    break;
            }
            retorno.ValorFrete = Convert.ToDouble(nvc["ValorFrete"].Replace(',', '*').Replace('.', ',').Replace('*', '.'), CultureInfo.InvariantCulture);
            retorno.Anotacao = nvc["Anotacao"];
            retorno.Data = DateTime.ParseExact(nvc["DataTransacao"], "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
            switch (nvc["TipoPagamento"]) {
                case "Pagamento":
                    retorno.TipoPagamento = TipoPagamento.PagSeguro;
                    break;
                case "Cartão de Crédito":
                    retorno.TipoPagamento = TipoPagamento.CartaoCredito;
                    break;
                case "Boleto":
                    retorno.TipoPagamento = TipoPagamento.Boleto;
                    break;
                case "Pagamento online":
                    retorno.TipoPagamento = TipoPagamento.TransferenciaOnline;
                    break;
            }
            switch (nvc["StatusTransacao"]) {
                case "Completo":
                    retorno.StatusTransacao = StatusTransacao.Completo;
                    break;
                case "Aguardando Pagto":
                    retorno.StatusTransacao = StatusTransacao.AguardandoPagamento;
                    break;
                case "Aprovado":
                    retorno.StatusTransacao = StatusTransacao.Aprovada;
                    break;
                case "Em Análise":
                    retorno.StatusTransacao = StatusTransacao.EmAnalise;
                    break;
                case "Cancelado":
                    retorno.StatusTransacao = StatusTransacao.Cancelada;
                    break;
            }

            //Cliente
            retorno.Cliente = new Cliente();
            retorno.Cliente.Nome = nvc["CliNome"];
            retorno.Cliente.Email = nvc["CliEmail"];
            retorno.Cliente.Endereco = nvc["CliEndereco"];
            retorno.Cliente.Numero = nvc["CliNumero"];
            retorno.Cliente.ComplementoEndereco = nvc["CliComplemento"];
            retorno.Cliente.Bairro = nvc["CliBairro"];
            retorno.Cliente.Cidade = nvc["CliCidade"];
            retorno.Cliente.Uf = nvc["CliEstado"];
            retorno.Cliente.Cep = int.Parse(nvc["CliCEP"]);
            retorno.Cliente.DDD = int.Parse(nvc["CliTelefone"].Split(' ')[0]);
            retorno.Cliente.Telefone = int.Parse(nvc["CliTelefone"].Split(' ')[1]);

            //Produtos
            retorno.Produtos.Clear();
            for (int i = 0; i < int.Parse(nvc["NumItens"]); i++) {
                Produto produto = new Produto();
                produto.Codigo = nvc["ProdID_" + i];
                produto.Descricao = nvc["ProdDescricao_" + i];
                produto.Valor = Convert.ToDouble(nvc["ProdValor_" + i].Replace(',', '*').Replace('.', ',').Replace('*', '.'), CultureInfo.InvariantCulture);
                produto.Quantidade = int.Parse(nvc["ProdQuantidade_" + i]);
                produto.Frete = Convert.ToDouble(nvc["ProdFrete_" + i].Replace(',', '*').Replace('.', ',').Replace('*', '.'), CultureInfo.InvariantCulture);
                produto.ValorExtra = Convert.ToDouble(nvc["ProdExtras_" + i].Replace(',', '*').Replace('.', ',').Replace('*', '.'), CultureInfo.InvariantCulture);
                retorno.Produtos.Add(produto);
            }

            return retorno;
        }
    }

    public enum TipoFrete {
        Fixo,
        Sedex,
        PAC
    }

    public enum TipoPagamento {
        PagSeguro,
        CartaoCredito,
        Boleto,
        TransferenciaOnline
    }

    public enum StatusTransacao {
        Completo,
        AguardandoPagamento,
        Aprovada,
        EmAnalise,
        Cancelada
    }
}
